/*

cimahis - Software para el analisis de imagenes de corte histologico

Copyright (C) Andrés De Abreu 2010 <jadabreu @ gmail . com>


Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos
de la Licencia Pública General de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su elección) de cualquier versión
posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA,
incluso sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
PROPÓSITO PARTICULAR. Véase la Licencia Pública General de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General junto con este programa.
Si no ha sido así, escriba a la Free Software Foundation, Inc.,
en 675 Mass Ave, Cambridge, MA 02139, EEUU.

    //ACERCA DE visualizarhistograma.cpp
    *
    * Declaracion de la clase visualizarhistograma la cual se encarga de crear la interfaz
    * grafica para la visualización de los filtros
    *

*/

#include "visualizarhistograma.h"
#include "ui_visualizarhistograma.h"
#include "stdio.h"
#include "QImage"




VisualizarHistograma::VisualizarHistograma(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::VisualizarHistograma)  //constructor
{
    ui->setupUi(this);
}

VisualizarHistograma::~VisualizarHistograma() //destructor
{
    delete ui;
}

void VisualizarHistograma::changeEvent(QEvent *e)   //Metodo para controlar los eventos (generado automaticamente por QT)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void VisualizarHistograma::actualizarDatosEstadisticos(histograma *a)
{
    //metodo que se encarga de poner los datos del histograma a en la interfaz grafica

    std::stringstream buffer;  //buffer
    buffer << (a->obtenerMedia()); // pasar el valor de la media al buffer
    std::string media= buffer.str();      //convierto el bufer en un string
    ui->labelMedia->setText(tr(media.c_str())); //paso la string a la etiqueta de la interfaz

    buffer.str("");  //borrar buffer
    buffer << (a->obtenerMediana());   //de aqui en adelante se have igual
    std::string mediana= buffer.str();
    ui->labelMediana->setText(tr(mediana.c_str()));

    buffer.str("");
    buffer << (a->obtenerModa());
    std::string moda= buffer.str();
    ui->labelModa->setText(tr(moda.c_str()));

    buffer.str("");
    buffer << (a->obtenerDesvEstandar());
    std::string desv= buffer.str();
    ui->labelDesv->setText(tr(desv.c_str()));

    buffer.str("");
    buffer << (a->obtenerRango());
    std::string rango= buffer.str();
    ui->labelRango->setText(tr(rango.c_str()));
}

void VisualizarHistograma::calcularHistogramas(IplImage *i)
{

//metodo utilizado para calcular el o los histogramas de la imagen, dependiendo del numero de canales que tenga la misma

    if (i->nChannels==3) 
    {
        histCanal1 = f.crearHistograma(obtenerEspacioColor(i));
        histCanal2 = f.crearHistograma("RGB");
        histCanal3 = f.crearHistograma("RGB");

        if (obtenerEspacioColor(i)=="RGB")
        {
            cvCvtColor(i,i,CV_BGR2RGB);
        }

        histCanal1->calcularHist(obtenerCanal(i,1));
        histCanal2->calcularHist(obtenerCanal(i,2));
        histCanal3->calcularHist(obtenerCanal(i,3));

        espacioColorHist=obtenerEspacioColor(i);


    }
    else
    {
        string espacioColor;
        espacioColor.append(i->colorModel);

        if (espacioColor=="H")
        {
            histCanal1 = f.crearHistograma("HSV");
            histCanal1->calcularHist(i);
            espacioColorHist.append("Tinte");
        }
        else
        {
            histCanal1 = f.crearHistograma("RGB");
            histCanal1->calcularHist(i);
            espacioColorHist.append("GRIS");

        }


    }
    cvReleaseImage(&i);
}

void VisualizarHistograma::prepararInterfaz()
{
//metodo utilizado para preparar la interfaz (generar las entradas de la lista desplegable y dibujar los histogramas)

    if(espacioColorHist=="RGB")
    {
        //Llenar la lista desplegable
        ui->comboBox->addItem(tr("Canal R"));
        ui->comboBox->addItem(tr("Canal G"));
        ui->comboBox->addItem(tr("Canal B"));
        ui->comboBox->addItem(tr("RGB"));
    }
    if(espacioColorHist=="HSV")
    {
        ui->comboBox->addItem(tr("Canal H"));
        ui->comboBox->addItem(tr("Canal S"));
        ui->comboBox->addItem(tr("Canal V"));
    }
    if(espacioColorHist=="HSL")
    {
        ui->comboBox->addItem(tr("Canal H"));
        ui->comboBox->addItem(tr("Canal S"));
        ui->comboBox->addItem(tr("Canal L"));
    }



    if (espacioColorHist!="GRIS")
    {
        imagenCanal1=histCanal1->dibujarHist();

        imagenInterfaz=IplImage2QImage(imagenCanal1);
        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));

        this->actualizarDatosEstadisticos(histCanal1);

    }


    //////////////////////////////
    if (espacioColorHist=="GRIS")
    {
        imagenCanal1=histCanal1->dibujarHist();

        this->actualizarDatosEstadisticos(histCanal1);

        imagenInterfaz=IplImage2QImage(imagenCanal1);
        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));

        ui->comboBox->setDisabled(true);
    }


}

void VisualizarHistograma::on_comboBox_currentIndexChanged(int index)
{
//metodo que se dispara cuando es seleccionada una opcion en la lista desplegable
    if (index == 0)
    {
        imagenCanal1=histCanal1->dibujarHist();
        //imagenCanal1.guardarImagen("salidaCanal1.jpg");

        this->actualizarDatosEstadisticos(histCanal1);

        imagenInterfaz=IplImage2QImage(imagenCanal1);
        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));
    }
    if (index == 1)
    {
        imagenCanal2=histCanal2->dibujarHist();
        //imagenCanal2.guardarImagen("salidaCanal2.jpg");

        this->actualizarDatosEstadisticos(histCanal2);

        imagenInterfaz=IplImage2QImage(imagenCanal2);
        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));
    }
    if (index == 2)
    {
        imagenCanal3=histCanal3->dibujarHist();
      //  imagenCanal3.guardarImagen("salidaCanal3.jpg");

        this->actualizarDatosEstadisticos(histCanal3);

        imagenInterfaz=IplImage2QImage(imagenCanal3);
        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));
    }
    if (index == 3)
    {
        imagenMezcla=histCanal3->dibujarGrupo(histCanal2,histCanal1);
        imagenInterfaz=IplImage2QImage(imagenMezcla);

        ui->label_2->setPixmap(QPixmap::fromImage(imagenInterfaz));


        ui->labelMedia->setText(tr(""));

        ui->labelMediana->setText(tr(""));

        ui->labelModa->setText(tr("")); //cuando el histograma es conjunto se dejan los datos estadisticos en blanco

        ui->labelDesv->setText(tr(""));

        ui->labelRango->setText(tr(""));
    }


}
